package lab5;

import static java.lang.Math.abs;

/**
 * Created with IntelliJ IDEA.
 * User: Борис
 * Date: 30.11.13
 * Time: 13:38
 * To change this template use File | Settings | File Templates.
 */
public class LabSix {
    private double[][] B;
    private double[][] d;
    private int size;
    private double accuracy;
    private long count = 0;

    LabSix(double[][] B, double[][] d, double accuracy){
        this.B = B;
        this.d = d;
        this.accuracy = accuracy;
        size = B.length;
    }

    long getCount(){
        return count;
    }

    double[][] methodOfSimpleIteration(){
        double[][] x0 = new double[size][1];
        for(int i = 0; i<size; i++)
            x0[i][0] = d[i][0];
        double[][] x1;
        do{
            count++;
            x1 = multiplyMatrix(B,x0);
            sumVector(x1);
            if (getNormС(x1,x0)<=accuracy) return x1;
            x0 = x1;
            //System.out.println(count);
        }while(true);
    }

    // умножает квадратную матрицу matrix на вектор vector, результат возвращает
    double[][] multiplyMatrix(double[][] matrixOne, double[][] vector){
        int strings = matrixOne.length;
        int columns = vector[0].length;
        double[][] result = new double[strings][columns];
        double sum = 0;
        for(int k=0; k<strings; k++){
            for(int j=0; j<columns; j++){
                for (int i=0; i<strings; i++){
                    sum += matrixOne[k][i]*vector[i][j];
                }
                result[k][j]=sum;
                sum = 0;
            }
            sum = 0;
        }
        return result;
    }

    // вычисляет суммы векторов v1 и v2, результат записывает в вектор v1
    void sumVector(double[][] v1){
        for(int i = 0; i<size; i++)
            v1[i][0] += d[i][0];
    }

    // возвращает норму С разности вектров x1 и x0
    double getNormС(double[][] x1,double[][] x0){
        double max = abs(x1[0][0]-x0[0][0]);
        double r;
        for(int i = 1; i<size; i++){
            r = abs(x1[i][0] - x0[i][0]);
            if (max<r) max = r;
        }
        return max;
    }
}
